/*
 * @Author: your name
 * @Date: 2020-08-23 15:13:23
 * @LastEditTime: 2020-08-23 15:35:56
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \demo\day02\demo9\main.go
 */
// 思路就是 根据不同的传参最终得到的结果能解决同样的问题
// 比如一个数据，根据客户不同的选择存储，可以存DB或者内存，结果都是实现存储的方案
// 中间的实现是可拓展的，比如突然有客户要求我需要存redis那么就可以拓展出来redis的方案
// 同样其他地方不需要做任何的改变，根据用户的传参来实现
// 选项设计模式

// 代码实现如下 原理：类似构造方法

package demo9

// 参数结构体有非常多的参数
// 参数可变
type Options struct {
	StrOption1 string
	StrOption2 string
	StrOption3 string
	IntOption1 int
	IntOption2 int
	IntOption3 int
}

// 关键地方，定义一个函数类型的参数
type optionFuncs func(opt *Options)

// 初始化 实现每一个函数的方法
func InitOption(opts ...optionFuncs) Options {
	option := Options{}
	for _, opt := range opts {
		opt(&option)
	}
	return option
}

// 实现上面定义的函数类型，该方法可以根据参数进行拓展
func WithStrOption1(str string) optionFuncs {
	return func(opt *Options) {
		opt.StrOption1 = str
	}
}
func WithStrOption2(str string) optionFuncs {
	return func(opt *Options) {
		opt.StrOption2 = str
	}
}
func WithStrOption3(str string) optionFuncs {
	return func(opt *Options) {
		opt.StrOption3 = str
	}
}

func WithIntOption1(i int) optionFuncs {
	return func(opt *Options) {
		opt.IntOption1 = i
	}
}

func WithIntOption2(i int) optionFuncs {
	return func(opt *Options) {
		opt.IntOption2 = i
	}
}

func WithIntOption3(i int) optionFuncs {
	return func(opt *Options) {
		opt.IntOption3 = i
	}
}
